/**
 * Rack.java - Liste de jetons disponibles pour un joueur
 * 
 * @author BOURGE Denis && BEGORRE Alexandre
 * @version 1.0
 */

package elements.jetons;

import java.io.IOException;

import utils.InfoException;
import elements.plateau.Case;
import elements.plateau.CaseType;

public class Rack {

	private Case[]			jetons;
	private int				jetonsCourants;
	public static final int	NOMBRE_LETTRES	= 7;

	/**
	 * Constructeur du rack
	 */
	public Rack() {

		jetons = new Case[NOMBRE_LETTRES];
		for (int i = 0; i < NOMBRE_LETTRES; i++) {
			jetons[i] = new Case(null, CaseType.RACK, "data/graphics/lettres/vide.png");
		}

		jetonsCourants = 0;
	}

	/**
	 * Pioche dans le sac passé en paramètre
	 * 
	 * @param s
	 *            Le sac
	 */
	public void piocher(Sac s) {

		if (jetonsCourants != NOMBRE_LETTRES) {
			for (int i = 0; i < NOMBRE_LETTRES; i++) {
				if (jetons[i].getJeton() == null) {
					jetons[i].chargerJeton(s.jetonAleatoire());
					jetonsCourants++;
				}
			}
		}
	}

	/**
	 * Jette les lettres voulues (ou toutes si aucun mot n'est passé)
	 * 
	 * @param lettres
	 *            Lettres choisies
	 * @param s
	 *            Sac où remettre les lettres
	 * @throws InfoException
	 *             Messages possibles
	 */
	public void jeterLettres(String lettres, Sac s) throws InfoException {

		if (lettres != "") {
			Rack tmp = this.getCopie();
			for (int i = 0; i < lettres.length(); i++)
				if (!tmp.estDans(lettres.charAt(i))) {
					throw new InfoException("Y'a un problème ! On ne doit enlever que des lettres que l'on a !");
				}

			for (int i = 0; i < lettres.length(); i++) {
				s.ajouterJeton(jetons[this.positionJeton(lettres.charAt(i))].getJeton());
				jetons[this.positionJeton(lettres.charAt(i))].chargerJeton(null);
				jetonsCourants--;
			}
		} else {
			for (int i = 0; i < Rack.NOMBRE_LETTRES; i++) {
				s.ajouterJeton(jetons[i].getJeton());
				jetons[i].chargerJeton(null);
				jetonsCourants--;
			}
		}
	}

	/**
	 * Retourne une copie du Rack courant
	 * 
	 * @return Une copie du Rack courant
	 */
	public Rack getCopie() {

		Rack tmp = new Rack();

		tmp.jetons = new Case[NOMBRE_LETTRES];
		for (int i = 0; i < NOMBRE_LETTRES; i++) {
			tmp.jetons[i] = new Case(jetons[i].getJeton(), jetons[i].getType(), jetons[i].getPathToImage());
		}

		tmp.jetonsCourants = jetonsCourants;

		return tmp;
	}

	/**
	 * Modifie le Rack courant en fonction d'une copie de celui-ci
	 * 
	 * @param tmp
	 *            Rack source
	 */
	public void setRack(Rack tmp) {

		for (int i = 0; i < NOMBRE_LETTRES; i++) {
			jetons[i].chargerJeton(tmp.jetons[i].getJeton());
			jetons[i].setType(tmp.jetons[i].getType());
		}

		jetonsCourants = tmp.jetonsCourants;
	}

	/**
	 * Retourne le nombre de jetons du Rack
	 * @return Le nombre de jetons du Rack
	 */
	public int getJetonsCourants() {
		return jetonsCourants;
	}
	
	/**
	 * Dit si un jeton est dans le rack (et le supprime)
	 * 
	 * @param c
	 *            Caractère du jeton
	 * @return Oui/Non
	 */
	public boolean estDans(char c) {

		boolean retour = false;

		for (int i = 0; i < NOMBRE_LETTRES; i++) {
			if (jetons[i].getJeton() != null) {
				if (jetons[i].getJeton().getLettre() == c) {
					jetons[i].chargerJeton(null);
					jetonsCourants--;
					retour = true;
					break;
				}
			}
		}

		return retour;
	}

	/**
	 * Récupère la position d'un jeton dans le rack
	 * 
	 * @param c Caractère recherché
	 * @return Position
	 */
	public int positionJeton(char c) {

		int retour = -1;

		for (int i = 0; i < Rack.NOMBRE_LETTRES; i++) {
			if (jetons[i].getJeton() != null) {
				if (jetons[i].getJeton().getLettre() == c) {
					retour = i;
				}
			}
		}

		return retour;
	}

	/**
	 * Retourne le jeton de la case i du rack
	 * 
	 * @param i
	 *            La case voulue
	 * @return Le jeton voulu
	 */
	public Case getCase(int i) {

		return jetons[i];
	}

	/**
	 * Fonction de débuggage - Afficher dans la console
	 */
	public void afficherConsole() {

		for (int i = 0; i < NOMBRE_LETTRES; i++) {
			if (jetons[i].getJeton() == null) {
				System.out.print('_');
			} else {
				System.out.print(jetons[i].getJeton().getLettre());
			}
		}

		System.out.println("");
	}

	/**
	 * Fonction principale (de test)
	 * 
	 * @param args
	 *            Arguments en ligne de commande
	 */
	public static void main(String[] args) {

		try {
			Sac s = new Sac("data/dicos/dico_francais.txt");
			Rack r = new Rack();

			r.afficherConsole();

			r.piocher(s);
			r.afficherConsole();

			r.jeterLettres("", s);
			r.afficherConsole();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InfoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}
